#include <iostream>

using namespace std;

template <typename... Args>
struct ArgsNDetail;
template <typename T, typename... Args>
struct ArgsNDetail<T, Args...> { static constexpr size_t _n = 1 + ArgsNDetail<Args...>::_n; };
template <> struct ArgsNDetail<> { static constexpr size_t _n = 0; };
template <typename... Args>
constexpr size_t argsN = ArgsNDetail<Args...>::_n;
template <typename... Args>
constexpr size_t argsS = sizeof...(Args);


template <typename... Args>
struct A
{
	A() { cout << "A1:" << sizeof...(Args) << endl; }
};
template <typename... Args> requires (sizeof...(Args) > 2)
struct A<Args...>
{
	A() { cout << "A2:" << sizeof...(Args) << endl; }
};

int main()
{
#if 0
	cout << argsN<> << endl;
	cout << argsN<int> << endl;
	cout << argsN<int, int> << endl;
	cout << argsN<int, int, int> << endl;
	cout << argsN<int, int, int, int> << endl;
	cout << argsN<int, int, int, int, int> << endl;
	cout << argsN<int, int, int, int, int, int> << endl;

	cout << argsS<> << endl;
	cout << argsS<int> << endl;
	cout << argsS<int, int> << endl;
	cout << argsS<int, int, int> << endl;
	cout << argsS<int, int, int, int> << endl;
	cout << argsS<int, int, int, int, int> << endl;
	cout << argsS<int, int, int, int, int, int> << endl;
#endif
	A<>{};
	A<int>{};
	A<int, int>{};
	A<int, int, int>{};
	A<int, int, int, int>{};
	A<int, int, int, int, int>{};
	A<int, int, int, int, int, int>{};
}